#include <iostream>
#include <cstring>
#include <queue>

using namespace std;
using ll=long long;
const int N=3*1e4+10;

int h[N],to[N],ne[N],w[N],idx;
ll dist[N];
int st[N];
int cnt[N];
int n,m;
void add(int x,int y,int z)
{
	to[idx]=y;
	ne[idx]=h[x];
	w[idx]=z;
	h[x]=idx++;
}
bool spfa()
{
	memset(dist,0x3f3f3f3f,sizeof(dist));
	dist[0]=0;
	queue<int> q;
	q.push(0);
	st[0]=1;
	while(q.size())
	{
		int u=q.front();
		q.pop();
		st[u]=0;
		for(int i=h[u];~i;i=ne[i])
		{
			int j=to[i];
			if(dist[u]+w[i]<dist[j])
			{
				dist[j]=dist[u]+w[i];
				cnt[j]=cnt[u]+1;
				if(cnt[j]>n)
					return false;
				if(!st[j])
				{
					q.push(j);
					st[j]=1;
				}
			}
		}
	}
	return true;
}
int main()
{
	
	cin>>n>>m;
	memset(h,-1,sizeof(h));
	
	for(int i=1;i<=n;i++)
		add(0,i,0);
	for(int i=0;i<m;i++)
	{
		int op;
		cin>>op;
		int a,b,c;
		cin>>a>>b;
		if(op==1)
		{
			cin>>c;
			//a>=b+c
			add(a,b,-c);
		}
		else if(op==2)
		{
			cin>>c;
			//b>=a-c
			add(b,a,c);
		}
		else{
			add(a,b,0);
			add(b,a,0);
		}
	}
	if(spfa())
	{
		cout<<"Yes"<<endl;
	}
	else{
		cout<<"No"<<endl;
	}
	return 0;
}
